\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{mer. mai 19 15:50:15 CEST 2010}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={MySQL - Réplication},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Réplication MySQL},
CreationDate={D:20100519155015},
ModDate={D:20100519155015},
Keywords={mysql;db;databases}
}}
\begin{document}
 
\begin{center}
{\Huge MySQL - Réplication }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Réplication MySQL}
 
\vspace{10mm}
 
\hspace{1mm}  MySQL supporte la réplication unidirectionnelle interne. Un serveur sert de maître, et les autres servent d'esclaves. Le serveur entretient des logs binaires, ainsi qu'un fichier d'index des logs binaires.
\vspace{5mm} \\
 
 
\hspace{1mm}  Chaque esclave, après connexion réussie au serveur maître, indique le point qu'il avait atteint depuis la fin de la dernière réplication, puis récupère les dernière modifications, puis se met en attente des prochains évènements en provenance du maître.
\vspace{5mm} \\
\hspace{1mm}  Un esclave peut aussi servir de maître à son tour, pour réaliser une chaîne de réplication. toute modification des tables sont répliquées, et doivent intervenir sur le serveur maître.
\vspace{5mm} \\
\hspace{1mm}  On peut utiliser la commande \textbf{LOAD DATA FROM MASTER} pour configurer une esclave. Mais ne fonctionne que si toutes les tables du maître sont du type \textbf{MyISAM}, et qu'il est possible d'obtenir un verrou de lecture global, pour qu'aucune lecture ne se fasse durant le transfert des tables depuis le maître.
\vspace{5mm} \\
 
 
\hspace{1mm}  Cette limitation est temporaire et sera supprimée une fois le système de sauvegarde programmé. On estime une vitesse de 1Mo par seconde.
\vspace{5mm} \\
\hspace{1mm}  Si le maître est indisponible ou que la connexion est perdue, l'esclave va tenter une reconnexion tous les \textbf{master-connect-retry} secondes.
\vspace{5mm} \\
\hspace{1mm}  Les capacités de réplications de MySQL sont implémentées à l'aide de 3 threads : 1 sur le maitre et 2 sur l'esclave. Lorsque la commande \textbf{START SLAVE} est envoyée, l'esclave crée un thread d'I/O qui se connecte au maître et lit les logs binaires. le maître crée un thread pour envoyer les logs binaires. Ce thread est le Binlog Dump dans le résultat de \textbf{SHOW PROCESSLIST}. Le 3eme thread lit les commandes et les exécute. pour obtenir des info sur les esclaves : \textbf{SHOW SLAVE STATUS}.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Fichiers de relais et de statut de la réplication }
 
\
 
\hspace{1mm}  Par défaut ils sont nommés sous la forme \textbf{host\_name-relay-bin.nnn} où \textbf{host\_name} est le nom de l'esclave. l'esclave garde la trace des logs dans un fichier d'index \textbf{host\_name-relay-bin.index}. Les noms par défaut se remplacent avec les options : \textbf{--relay-log} et \textbf{--relay-log-index}.
\vspace{5mm} \\
\hspace{1mm}  ces logs ont le même format que les logs binaires et peuvent être lus avec mysqlbinlog.
\vspace{5mm} \\
\hspace{1mm}  Un log est crée à chaque démarrage du serveur, par la commande \textbf{FLUSH LOGS} ou une taille supérieure à \textbf{max\_relay\_log\_size}.
\vspace{5mm} \\
\hspace{1mm}  Un esclave crée 2 autres fichiers appelés \textbf{master.info} et \textbf{relay-log.info} qui contiennent des informations comme celle affichées par la commande \textbf{SHOW SLAVE STATUS}.
\vspace{5mm} \\
\hspace{1mm}  Si vous perdez les logs, mais que \textbf{relay-log.info} existe, on peut l'étudier pour déterminer ce que le thread SQL a traité, puis utiliser \textbf{CHANGE MASTER TO} avec les options \textbf{MASTER\_RELAY\_LOG} et \textbf{MASTER\_RELAY\_POS} pour lui faire relire les logs depuis ce point.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Mise en place de la réplication }
 
\
 
\hspace{1mm}  Il est nécessaire d'éteindre brièvement le serveur principal.
\vspace{5mm} \\
\hspace{1mm}  Créer un utilisateur Mysql spécial pour la réplication, avec les droits de \textbf{REPLICATION SLAVE}. Il faut lui donner les droits de réplication depuis tous les esclaves. Le nom d'hôte doit être tel que chaque serveur esclave peut l'utiliser pour se connecter au maître :
\vspace{5mm} \\
\hspace{1mm}  \textbf{GRANT REPLICATION SLAVE ON generator.php TO replication@'\%s' identified by 'password'}
\vspace{5mm} \\
\hspace{1mm}  Si on envisage d'utiliser \textbf{LOAD TABLE FROM MASTER} ou \textbf{LOAD DATA FROM MASTER} sur l'esclave, on doit donner des droits supplémentaires : \textbf{SUPER} et \textbf{RELOAD}, ainsi que les droits \textbf{SELECT} sur les tables à charger.
\vspace{5mm} \\
\hspace{1mm}  Si on utilise des tables MyISAM, décharger toutes les tables et blocs en utilisant \textbf{FLUSH TABLES WITH READ LOCK ;} puis faire une sauvegarde des données du maître.
\vspace{5mm} \\
 
 
\hspace{1mm} Éventuellement compresser la sauvegarde \\
\hspace{1mm} \textbf{tar -cvf /tmp/mysql-snapshot.tar ./cette\_base} \\
\hspace{1mm} puis copier l'archive sur l'esclave au même emplacement et la décompresser \\
\hspace{1mm} \textbf{tar -xvf /tmp/mysql-snapchot.tar} \\
\hspace{1mm} Il n'est pas besoin de répliquer la base mysql \\
\hspace{1mm} Lorsque le verrou de lecture a été posé par \\
\hspace{1mm} \textbf{FLUSH TABLES WITH READ LOCK} \\
\hspace{1mm} lire les valeurs courantes du fichier de log et de son offset sur le maitre \\
\hspace{1mm} \textbf{SHOW MASTER STATUS;} \\
\hspace{1mm} la colonne file montre le nom du fichier de log et la colonne position affiche l'offset. Pour enlever le verrou \\
\hspace{1mm} \textbf{UNLOCK TABLES;} \\
\hspace{1mm} pour faire une sauvegarde rapide d'une base InnoDB le mieux est d'arrêter le serveur, puis de copier les fichiers de données InnoDB, leur logs et leur fichier de définition (.frm). Puis utiliser \\
\hspace{1mm} \textbf{SHOW MASTER STATUS} \\
\hspace{1mm} Pour noter l'offset courant. Puis éteindre le serveur sans déverrouiller le serveur et vérifier par \\
\hspace{1mm} \textbf{mysqladmin -root shutdown} \\
\hspace{1mm} Une alternative, valable pour les 2 types MyISAM et InnoDB est de prendre un export SQL du maître mais c'est plus long \\
\hspace{1mm} \textbf{mysqldump -master-data} \\
\hspace{1mm} sur le maitre, puis exécuter les commandes SQL sur les esclaves \\
 
\begin{description} \normalsize
\item[\hspace{1mm} -]{Si le maître fonctionne sans l'option \textbf{-log-bin}, le nom du fichier de log et l'offset seront vides, dans ce cas utiliser la chaîne vide ('') comme nom de fichier de log et la valeur 4 comme offset.}
\item[\hspace{1mm} -]{Dans my.cnf, ajouter les options \textbf{-log-bin} et \textbf{server-id=unique\_number} dans le groupe \textbf{[mysqld]}. Chaque serveur doit avoir un identifiant différent.}
\item[\hspace{1mm} -]{Copier la sauvegarde des données dans les esclaves, s'assurer que les droits sur ces données sont corrects. L'utilisateur qui fait fonctionner MySQL doit avoir les droits d'écriture et de lecture sur ces bases, comme le maître.}
\item[\hspace{1mm} -]{Redémarrer les esclaves. lancer l'esclave avec l'option \textbf{--skip-slave-start} s'il était déjà configuré pour la réplication. Utiliser \textbf{--log-warnings} pour plus de détails.}
\item[\hspace{1mm} -]{Si vous avez fait une sauvegarde du maître avec l'utilitaire mysqldump, charger l'export avec \textbf{mysql -u root -p < dump\_file.sql}}
\end{description}
 
\hspace{1mm} puis sur l'esclave en utilisant les valeurs lu sur le maître \\
\hspace{1mm} \textbf{mysql> CHANGE MASTER TO} \\
\hspace{1mm} \textbf{-> MASTER\_HOST='<master host name>',} \\
\hspace{1mm} \textbf{-> MASTER\_USER='<replication user name>',} \\
\hspace{1mm} \textbf{-> MASTER\_PASSWORD='<replication password>',} \\
\hspace{1mm} \textbf{-> MASTER\_LOG\_FILE='<recorded log file name>',} \\
\hspace{1mm} \textbf{-> MASTER\_LOG\_POS=<recorded log offset> ;} \\
\hspace{1mm} Lancer les thread esclaves \\
\hspace{1mm} \textbf{mysql > START SLAVE ;} \\
\hspace{1mm} l'esclave devrait alors se connecter au maître pour rattraper les modifications. \\
 
\begin{description} \normalsize
\item[\hspace{1mm} ]{Une fois que l'esclave a initié la réplication, vous trouverez 2 fichiers : master.info et relay.info}
\item[\hspace{1mm} ]{Options pour les esclaves, normalement il y'en a pas besoin ils sont dans master.info}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} --master-host]{}
\item[\hspace{1mm} --master-user]{}
\item[\hspace{1mm} --master-password]{}
\item[\hspace{1mm} --master-port]{}
\item[\hspace{1mm} --master-connect-retry]{}
\item[\hspace{1mm} --master-ssl]{}
\item[\hspace{1mm} --master-ssl-ca]{}
\item[\hspace{1mm} --master-ssl-capath]{}
\item[\hspace{1mm} --master-ssl-cert]{}
\item[\hspace{1mm} --master-ssl-cipher]{}
\item[\hspace{1mm} --master-ssl-key]{}
\end{description}
 
\hspace{1mm}  Ces commandes sont utilisés lors du lancement de l'esclave la première fois ou après un \textbf{RESET SLAVE} et arrêté puis relancé le serveur. On peut préférer spécifier ces options avec \textbf{CHANGE MASTER TO}.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Exemple de configuration }
 
\
 
\hspace{1mm} [mysqld] \\
\hspace{1mm} server-id=2 \\
\hspace{1mm} master-host=db-master.mycompany.com \\
\hspace{1mm} master-port=3306 \\
\hspace{1mm} master-user=pertinax \\
\hspace{1mm} master-password=freitag \\
\hspace{1mm} master-connect-retry=60 \\
\hspace{1mm} report-host=db-slave.mycompany.com \\
 
\vspace{1cm}{\huge Options de contrôle de la réplication }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} --log-slave-updates]{Dit à l'esclave d'enregistrer les modifications effectuées par son thread SQL dans son propre log binaire. Par défaut, cette option est à Off. Pour que cette option ait un effet, l'esclave doit être lancé avec le log binaire activé. \textbf{--log-slave-updates} sert lorsque vous voulez faire une chaîne de serveur de réplication. Par exemple : \textbf{A -> B -> C}. C'est-à-dire, A sert de maître à l'esclave B, et B sert de maître à l'esclave C. Pour que cela fonctionne, avec B qui sert d'esclave et de maître simultanément, vous devez lancer B avec l'option \textbf{--log-slave-updates}. A et B doivent être lancés avec le log binaire activé.}
\item[\hspace{1mm} --log-warnings]{Fait que l'esclave affiche plus de message sur ses activités Cette option n'est pas limitée à la réplication.}
\item[\hspace{1mm} --master-connect-retry=seconds]{Le nombre de secondes qu'un esclave attend avant de tenter de se re-connecter au maître. Par défaut, elle vaut 60.}
\item[\hspace{1mm} --master-host=host]{Spécifie l'hôte ou l'IP du maître de réplication. Si cette option n'est pas fournie, le thread esclave ne sera pas lancé.}
\item[\hspace{1mm} --master-info-file=file\_name]{Le nom à utiliser pour le fichier dans lequel l'esclave stocke les informations sur le maître. Par défaut, c'est \textbf{mysql.info}}
\item[\hspace{1mm} --master-password=password]{Le mot de passe que l'esclave utilise lors de l'identification auprès du maître}
\item[\hspace{1mm} --master-port=port\_number]{Le port du maître que l'esclave utilise lors de l'identification auprès du maître. Si le port n'est pas configuré, la valeur de la variable \textbf{MYSQL\_PORT} est utilisée. Si vous n'y avez pas touché lors de la compilation avec configure, ce doit être 3306}
\item[\hspace{1mm} --master-ssl]{}
\item[\hspace{1mm} --master-ssl-ca=file\_name]{}
\item[\hspace{1mm} --master-ssl-capath=directory\_name]{}
\item[\hspace{1mm} --master-ssl-cert=file\_name]{}
\item[\hspace{1mm} --master-ssl-cipher=cipher\_list]{}
\item[\hspace{1mm} --master-ssl-key=file\_name]{Ces options servent à configurer la réplication chiffrée, lorsque la connexion avec le maître utilise SSL. Leurs significations respectives est la même que les options \textbf{--ssl, --ssl-ca, --ssl-capath, --ssl-cert, --ssl-cipher, --ssl-key}}
\item[\hspace{1mm} --master-user=username]{Le nom d'utilisateur que l'esclave utilise lors de l'identification auprès du maître. Le compte doit avoir les droits de \textbf{REPLICATION SLAVE}. Si l'utilisateur maître n'est pas configuré, l'utilisateur test est utilisé.}
\item[\hspace{1mm} --max-relay-log-size=\#]{Pour faire la rotation automatique des logs.}
\item[\hspace{1mm} --read-only]{Cette option fait que le serveur n'autorise aucune modification, hormis celles du thread esclave, ou celle des utilisateurs ayant les droits de \textbf{SUPER}. Cela peut être utile si vous voulez vous assurer que l'esclave ne reçoit aucune modification des clients.}
\item[\hspace{1mm} --relay-log=filename]{Pour spécifier la localisation et le nom qui doivent être utilisés pour les logs de relais. Les noms par défaut sont de la forme \textbf{host\_name-relay-bin.nnn}, où host\_name est le nom du serveur esclave et nnn indique le numéro de séquence du log de relais. Vous pouvez utiliser ces options pour avoir des noms de fichier de log de relais indépendants du nom d'hôte, ou si vos logs ont tendances à devenir très grands (et que vous ne voulez pas réduire la valeur de max\_relay\_log\_size) et que vous devez les mettre dans un autre dossier, ou simplement pour accélérer la vitesse d'équilibrage entre deux disques.}
\item[\hspace{1mm} --relay-log-index=filename]{Pour spécifier la localisation et le nom qui doivent être utilisés pour le fichier d'index du log de relais. Le nom par défaut est \textbf{host\_name-relay-bin.index}, où host\_name est le nom du serveur esclave.}
\item[\hspace{1mm} --relay-log-info-file=filename]{Pour donner au fichier \textbf{relay-log.info} un autre nom ou pour le placer dans un autre dossier. Le nom par défaut est \textbf{relay-log.info} dans le dossier de données.}
\item[\hspace{1mm} --relay-log-purge=0|1]{Active ou désactive la vidange automatique des logs de relais, dès qu'ils ne sont plus utiles. C'est une variable globale, qui peut être dynamiquement modifiée avec \textbf{SET GLOBAL RELAY\_LOG\_PURGE=0|1}. Sa valeur par défaut est 1.}
\item[\hspace{1mm} --relay-log-space-limit=\#]{Limite la taille maximale de tous les fichiers de logs de relais sur l'esclave (une valeur de 0 signifie "sans limite"). Lorsque la limite est atteinte, le thread d'I/O fait une pause : il ne lit plus rien dans le log binaire du maître, jusqu'à ce que le thread SQL ait avancé, et effacé des fichiers de logs. Notez que cette limite n'est pas absolue. Avec \textbf{--relay-log-space-limit}, il ne faut pas utiliser de valeur inférieure à deux fois la taille de \textbf{--max-relay-log-size} (ou \textbf{--max-binlog-size} si \textbf{--max-relay-log-size} vaut 0) car dans ce cas, il y a des chances que le thread d'I/O attende de l'espace libre parce que \textbf{--relay-log-space-limit} est dépassée, mais que le thread SQL n'ait pas de logs à effacer, et ne peut donc libérer le thread d'I/O, forcant le thread d'I/O à ignorer temporairement \textbf{--relay-log-space-limit}.}
\item[\hspace{1mm} --replicate-do-db=db\_name]{Indique à l'esclave qu'il doit restreindre la réplication aux commandes qui utilisent la base de données \textbf{db\_name} par défaut (c'est à dire celle qui est sélectionnée avec la commande \textbf{USE}). Pour spécifier plusieurs base de données, utilisez cette option aussi souvent que nécessaire. Noter que cela ne va pas autoriser les commandes multi-bases, comme \textbf{UPDATE some\_db.some\_table SET foo='bar'} si une base de données différente ou qu'aucune base de données n'est sélectionnée. Si vous avez besoin que les commandes multi-bases fonctionnent, utilisez \textbf{--replicate-wild-do-table=db\_name.\%}}
\end{description}
 
\hspace{1mm} Un exemple qui pourrait ne pas fonctionner comme vous l'attendez: si l'esclave est lancé avec --replicate-do-db=sales et que vous émettez une commande sur le maître, la commande UPDATE suivante ne sera pas répliquée: \\
\hspace{1mm} \textbf{USE prices;} \\
\hspace{1mm} UPDATE sales.january SET amount=amount+1000 ; \\
\hspace{1mm} \textbf{Si vous avez besoin de répliquer des commandes multi-bases, utilisez l'option --replicate-wild-do-table=db\_name.\% à la place.} \\
\hspace{1mm} \textbf{La raison principale de ce comportement "vérifie juste la base par défaut" est qu'il est difficile de savoir si une requête doit être répliquée, uniquement à partir de la requête. Par exemple, si vous utilisez une requête multi-tables DELETE ou multi-tables UPDATE, qui a des conséquences dans d'autres bases. La vérification de la base courante est aussi très rapide.} \\
 
\begin{description} \normalsize
\item[\hspace{1mm} --replicate-do-table=db\_name.table\_name]{Dit à l'esclave qu'il doit restreindre la réplication à une table spécifiée. Pour spécifier plusieurs tables, il faut utiliser cette directive plusieurs fois, une fois par table. Cela fonctionnera pour les mises à jours multi-bases, au contraire de \textbf{--replicate-do-db}}
\item[\hspace{1mm} --replicate-ignore-db=db\_name]{Indique à l'esclave qu'il doit ne doit pas assurer la réplication avec les commandes qui utilisent la base de données \textbf{db\_name} par défaut (c'est à dire celle qui est sélectionnée avec la commande USE). Pour spécifier plusieurs base de données, utilisez cette option aussi souvent que nécessaire. Note que cela ne va pas autoriser les commandes multi-bases, comme \textbf{UPDATE some\_db.some\_table SET foo='bar'} si une base de données différente ou qu'aucune base de données n'est sélectionnée. Si vous avez besoin que les commandes multi-bases fonctionnent, assurez vous que vous avez MySQL 3.23.28 ou plus récent, et utilisez \textbf{--replicate-wild-do-table=db\_name.\%}}
\end{description}
 
\hspace{1mm} Un exemple qui pourrait ne pas fonctionner comme vous l'attendez: si l'esclave est lancé avec --replicate-ignore-db=sales et que vous émettez une commande sur le maître, la commande UPDATE suivante ne sera pas répliquée \\
\hspace{1mm} \textbf{USE prices;} \\
\hspace{1mm} \textbf{UPDATE sales.january SET amount=amount+1000;} \\
\hspace{1mm} Si vous avez besoin de répliquer des commandes multi-bases, utilisez l'option --replicate-wild-ignore-table=db\_name.\% à la place \\
 
\begin{description} \normalsize
\item[\hspace{1mm} --replicate-ignore-table=db\_name.table\_name]{Dit à l'esclave qu'il ne doit pas répliquer les commandes qui touchent à la table spécifiée, même si d'autres tables sont modifiées dans la même commande. Pour spécifier plusieurs tables, il faut utiliser cette directive plusieurs fois, une fois par table. Cela fonctionnera pour les mises à jours multi-bases, au contraire de \textbf{--replicate-ignore-db}}
\end{description}
 
\vspace{1cm}{\huge Notes sur cette liste d'options }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} --replicate-wild-do-table=db\_name.table\_name]{Dit à l'esclave qu'il doit restreindre la réplication aux tables dont le nom vérifie le masque spécifié. Le masque peut contenir les caractères ‘\%’ et ‘\_’, qui ont la même signification que dans les expressions régulières de la clause LIKE. Pour spécifier plusieurs tables, il faut utiliser cette directive plusieurs fois, une fois par table. Cela fonctionnera pour les mises à jours multi-bases, au contraire de \textbf{--replicate-do-db}}
\end{description}
 
\hspace{1mm} Exemple : \\
\hspace{1mm} \textbf{--replicate-wild-do-table=foo\%.bar\%} \\
\hspace{1mm} va répliquer les mises à jour qui surviennent sur toutes les tables de toutes les bases qui commencent par foo, et dont le nom de table commence par bar. \\
 
\hspace{1mm}  Notez que si vous utilisez \textbf{--replicate-wild-do-table=foo\%.\%}, alors la règle sera propagée à \textbf{CREATE DATABASE} et \textbf{DROP DATABASE}, c'est à dire que ces deux commandes seront répliquées si le nom de la base correspond au masque (foo\% ici) (la magie est ici déclenchée par \% comme masque de table.).
\vspace{5mm} \\
\hspace{1mm}  Si le masque de noms de tables est \textbf{\%}, il accepte tous les noms de tables et les options s'appliquent aux commandes de niveau base de données (comme \textbf{CREATE DATABASE}, \textbf{DROP DATABASE} et \textbf{ALTER DATABASE}). Par exemple, si vous utilisez \textbf{--replicate-wild-do-table=foo\%.\%}, les commandes de niveau de base de données seront répliquées si le nom de la base de données est accepté par le masque foo\%.
\vspace{5mm} \\
 
 
\hspace{1mm}  Si vous voulez faire la réplication des tables du type \textbf{ma\_petite\%base} (ceci est le nom exact de la base), mais que vous ne voulez pas répliquer la base \textbf{ma1petiteAABCbase}, vous devez protéger les caractères '\textbf{\_}' et '\textbf{\%}': il faut utiliser une syntaxe équivalent à: \textbf{replicate-wild-do-table=my\textbackslash{}\_own\textbackslash{}\%db}. Et si vous spécifiez cette option en ligne de commande, suivant votre système, vous devrez protéger aussi le caractère \textbf{\textbackslash{}} (par exemple, en Shell bash, vous devez émettre une option sous la forme \textbf{--replicate-wild-do-table=my\textbackslash{}\textbackslash{}\_own\textbackslash{}\textbackslash{}\%db}).
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} --replicate-wild-ignore-table=db\_name.table\_name]{Dit à l'esclave qu'il ne doit pas répliquer les tables dont le nom vérifie le masque spécifié. Pour spécifier plusieurs tables, il faut utiliser cette directive plusieurs fois, une fois par table. Cela fonctionnera pour les mises à jours multi-bases, au contraire de \textbf{--replicate-do-db}.}
\end{description}
 
\hspace{1mm} Exemple \\
\hspace{1mm} \textbf{--replicate-wild-ignore-table=foo\%.bar\%} \\
\hspace{1mm} n'autorisera pas de modifications dans les tables des bases dont le nom commence par foo et dont le nom de table commence par bar. Pour des informations sur le fonctionnement du filtre, voyez l'option --replicate-wild-ignore-table. La règle pour inclure des caractères littéraux est la même que pour --replicate-wild-ignore-table. \\
 
\begin{description} \normalsize
\item[\hspace{1mm} --replicate-rewrite-db=from\_name->to\_name]{Dit à l'esclave de remplacer la base courante (celle qui est sélectionnée avec USE) par \textbf{to\_name} si elle était \textbf{from\_name} sur le maître. Seules les commandes impliquant des tables peuvent être affectées. (\textbf{CREATE DATABASE, DROP DATABASE} ne le seront pas), et uniquement si from\_name était la base de données courante sur le maître. Cela ne fonctionnera pas pour les commandes multi-bases de données. Notez que la traduction est faite avant que les règles \textbf{--replicate-*} ne soient testées.}
\end{description}
 
\hspace{1mm} Si vous utilisez cette option en ligne de commande, et que vous utilisez le caractère ‘\textbf{>}’, qui peut être spécial pour votre interpréteur Shell, protégez-le comme ceci : \\
\hspace{1mm} \textbf{shell> mysqld --replicate-rewrite-db="olddb->newdb"} \\
 
\begin{description} \normalsize
\item[\hspace{1mm} --replicate-same-server-id]{À utiliser sur les serveurs esclaves. Généralement, vous pouvez spécifier la valeur 0 pour éviter les réplications infinies. Si cette option vaut 1, l'esclave n'ignorera pas les événements de réplication, même s'ils portent son propre numéro d'identification. Normalement, cela n'est utile que pour de très rares configurations. Vous ne pouvez pas mettre cette option à 1 si \textbf{--log-slave-updates} est utilisé.}
\item[\hspace{1mm} --report-host=host]{Le nom d'hôte ou l'adresse IP de l'esclave, qui doit être indiquée lors de l'enregistrement de l'esclave chez le maître. Cela apparaîtra dans l'affichage de la commande \textbf{SHOW SLAVE HOSTS}. Laissez cette option vide pour que l'esclave ne s'enregistre pas sur le maître. Notez qu'il n'est pas suffisant pour que le maître lise l'adresse IP de l'esclave sur le socket, une fois que l'esclave se connecte. À cause du NAT et des problèmes de routages, cette IP peut être invalide pour se connecter au maître depuis l'hôte ou les autres esclaves.}
\item[\hspace{1mm} --report-port=port\_number]{Le port de connexion indiqué par l'esclave lors de son enregistrement chez le maître. Configurez cette option si l'esclave utilise un port autre que le port par défaut, ou si vous avez installé un tunnel spécial pour le maître ou les autres esclaves. Dans le doute, laissez cette option vide.}
\item[\hspace{1mm} --skip-slave-start]{Dit à l'esclave de ne pas lancer les threads esclaves au démarrage du serveur. L'utilisateur pourra les lancer manuellement, avec \textbf{START SLAVE}.}
\item[\hspace{1mm} --slave\_compressed\_protocol=\#]{Si cette option vaut 1, alors le protocole client/serveur compressé sera utilisé, si l'esclave et le maître le supportent.}
\item[\hspace{1mm} --slave-load-tmpdir=filename]{Cette option vaut par défaut la variable \textbf{tmpdir}. Lorsque le thread SQL réplique des commandes \textbf{LOAD DATA INFILE}, il extrait les fichiers à charger du log de relais dans un fichier temporaire, puis charge ce fichier dans la table. Si le fichier chargé sur le maître est immense, le fichier temporaire sera aussi grand. Il faudra donc dire à l'esclave de placer ces fichiers temporaires sur un grand disque, qui sera différent de \textbf{tmpdir}: utilisez cette option. Dans ce cas, vous pouvez aussi utiliser l'option \textbf{--relay-log}, car les fichiers de log de relais seront aussi grands. \textbf{--slave-load-tmpdir} doit pointer sur un système de fichier basés sur un disque, et non pas sur une portion de mémoire: l'esclave doit pouvoir accéder à ce fichier pour répliquer la commande \textbf{LOAD DATA INFILE}, même après un redémarrage.}
\item[\hspace{1mm} --slave-net-timeout=\#]{Le nombre de secondes à attendre des données du maître, avant d'annuler la lecture en considérant que la connexion est rompue, et de tenter de se reconnecter. La première reconnexion intervient immédiatement après l'expiration du délai. L'intervalle entre deux tentatives de connexion est contrôlé par l'option \textbf{--master-connect-retry}.}
\item[\hspace{1mm} --slave-skip-errors= \texttt{[}err\_code1,err\_code2,... | all\texttt{]}]{Normalement, la réplication s'arrête lorsqu'une erreur survient, ce qui vous donne l'opportunité de résoudre les incohérences manuellement. Cette option Indique au thread SQL les erreurs qu'il doit ignorer durant la réplication. N'utilisez pas cette option si vous ne connaissez pas la raison des erreurs que vous rencontrez. S'il n'y a pas de bugs dans votre réplication, et qu'il n'y a pas de bug dans MySQL, vous ne devriez pas rencontrer d'erreurs, ni utiliser cette option. L'utilisation abusive de cette option conduit irrémédiablement l'esclave à être désynchronisé avec le maître sans que vous ne sachiez d'où vient l'erreur.}
\end{description}
 
\hspace{1mm}  Pour les codes d'erreur, il faut utiliser les numéros d'erreurs fournis par l'esclave dans le log d'erreur, et dans le résultat de \textbf{SHOW SLAVE STATUS}. La liste complète des messages d'erreurs est disponible dans la distribution source, dans le fichier \textbf{Docs/mysqld\_error.txt}.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Exemple de réplication }
 
\
 
\hspace{1mm}  Mysql permet de multiples configurations de réplication.
\vspace{5mm} \\
\hspace{1mm}  \textbf{Sur le maître}
\vspace{5mm} \\
\hspace{1mm}  Dans \textbf{/etc/mysql/my.cnf} ajouter:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} log-bin]{les log-bin doivent être activés, c'est sur ces log que se base la réplication}
\item[\hspace{1mm} id-server=1]{ce numéro doit être unique à chaque serveur}
\end{description}
 
\hspace{1mm} on crée l'utilisateur pour la réplication \\
\hspace{1mm} \textbf{GRANT REPLICATION SLAVE ON generator.php TO replication@'server-B' identified by 'password'} \\
\hspace{1mm} puis on lock les tables \\
\hspace{1mm} \textbf{FLUSH TABLES WITH READ LOCK;} \\
\hspace{1mm} on note le fichier de log et sa position ; attention la valeur n'est valide que si log-bin est déjà activé, sinon utiliser les valeur par défaut \\
\hspace{1mm} \textbf{SHOW MASTER STATUS ;} \\
\hspace{1mm} on copie les tables que l'on souhaite répliquer pour les envoyer sur l'esclave. et on enlève le verrou \\
\hspace{1mm} \textbf{UNLOCK TABLES;} \\
\hspace{1mm} on peut relancer le serveur mysql \\
\hspace{1mm} \textbf{/etc/init.d/mysql restart} \\
 
\hspace{1mm}  \textbf{Sur le serveur esclave :}
\vspace{5mm} \\
\hspace{1mm}  dans \textbf{/etc/mysql/my.cnf}, dans la section \textbf{[mysqld]} ajouter:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} log-bin]{}
\item[\hspace{1mm} id-server=2]{}
\item[\hspace{1mm} skip-slave-start]{cette options sert pour éviter de prendre en compte les options de réplication puisque l'on va la lancer en ligne.}
\item[\hspace{1mm} \#master-host=server-B]{on laisse ces lignes commentée pour le premier démarrage.}
\item[\hspace{1mm} \#master-port=3306]{}
\item[\hspace{1mm} \#master-user=replication]{}
\item[\hspace{1mm} \#master-password=password]{}
\item[\hspace{1mm} \#master-connect-retry=60]{}
\item[\hspace{1mm} \#report-host=db-slave.uubu]{}
\item[\hspace{1mm} \#log-slave-updates]{n'est utile qu'en cas d'un modèle de réplication A > B > C. B joue alors le rôle de relay}
\end{description}
 
\hspace{1mm} on crée l'utilisateur pour la réplication \\
\hspace{1mm} \textbf{GRANT REPLICATION SLAVE ON generator.php TO replication@'server-A' identified by 'password'} \\
\hspace{1mm} on stop le serveur mysql \\
\hspace{1mm} \textbf{/etc/init.d/mysql stop} \\
\hspace{1mm} on copie les bases du master, bien vérifier les droits ! On relance le serveur mysql \\
\hspace{1mm} \textbf{/etc/init.d/mysql start} \\
\hspace{1mm} on lance la réplication \\
\hspace{1mm} \textbf{mysql> CHANGE MASTER TO} \\
\hspace{1mm} \textbf{-> MASTER\_HOST='server-A',} \\
\hspace{1mm} \textbf{-> MASTER\_USER='replication',} \\
\hspace{1mm} \textbf{-> MASTER\_PASSWORD='password',} \\
\hspace{1mm} le fichier de log qu'on a noté via SHOW MASTER STATUS \\
\hspace{1mm} \textbf{-> MASTER\_LOG\_FILE='<recorded log file name>',} \\
\hspace{1mm} idem pour la position \\
\hspace{1mm} \textbf{-> MASTER\_LOG\_POS=<recorded log offset> ;} \\
\hspace{1mm} puis lancement en tant qu'esclave \\
\hspace{1mm} \textbf{START SLAVE} \\
\hspace{1mm} ouvrir de nouveau /etc/mysql/my.cnf \\
\hspace{1mm} on peut supprimer \textbf{skip-slave-start} puisque la réplication est en place, et décommenter les lignes qu'on avait ajouté en commentaire. Relancer le serveur \\
\hspace{1mm} \textbf{/etc/init.d/mysql restart} \\
 
\vspace{1cm}{\huge Explication de log-slave-updates }
 
\
 
\hspace{1mm}  Le serveur \textbf{B} se base sur le \textbf{log-bin} du serveur \textbf{A} pour répliquer les données. Par défaut, le serveur \textbf{B} ne log pas dans ses \textbf{log-bin} les données de réplication. Dans le cas où on souhaiterai ajouter un serveur \textbf{C} qui se réplique sur \textbf{B}, il est nécessaire d'ajouter cette options, afin que les données répliquées soient bien écrite dans les \textbf{log-bin}.
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Autres exemple de réplication }
 
\
 
\hspace{1mm}  Le système est très souple, ici j'explique une réplication de type \textbf{A > B} + le principe pour une réplication en chaîne de type \textbf{A > B > C}.
\vspace{5mm} \\
\hspace{1mm}  Il est bien sûr possible que \textbf{B} et \textbf{C} se répliquent tous 2 sur \textbf{A} directement.
\vspace{5mm} \\
\hspace{1mm}  Il est même possible de créer une réplication croisée de type \textbf{A<>B}. La manip n'est pas très différente, mais un peu plus délicate.
\vspace{5mm} \\
\hspace{1mm}  Dans un premier temps il faut suivre l'exemple ci-dessus pour créer une réplication de \textbf{A} vers \textbf{B}. Ensuite reprendre l'exemple, locker les tables sur \textbf{B}, noter le \textbf{log-bin} et sa position, puis suivre l'exemple de \textbf{B} ci-dessus, et l'appliquer sur \textbf{A} : renseigner \textbf{/etc/mysql/my.cnf}, relancer le serveur, puis lancer la réplication.
\vspace{5mm} \\
 
\end{flushleft}
\end{document}
